package com.cyy;

import java.util.LinkedList;

/**
 * 双端队列
 * @author 会玩的洋洋
 * @since 2022-02-22
 * @param <E>
 *
 * 双端队列是能在头尾两端添加、删除的队列
 */
public class Deque<E> {
    /**
     * 与普通队列一样 使用 LinkedList 实现
     */
    private LinkedList<E> list = new LinkedList<>();

    /**
     * 元素个数
     * @return int
     */
    public int size() {
        return list.size();
    }

    /**
     * 判断队列是否为空
     * @return boolean
     */
    public boolean isEmpty() {
        return list.isEmpty();
    }

    /**
     * 队尾入队
     * @param element 入队元素
     */
    public void enQueueRear(E element) {
        /*  使用以下代码同理
           list.add(size(), element)
         */
        list.addLast(element);
    }

    /**
     * 队头出队
     * @return E
     */
    public E deQueueFront() {
        /*
          使用以下代码也可以
          list.remove(0)
         */
        return list.removeFirst();
    }

    /**
     * 队头入队
     * @param element 入队元素
     */
    public void enQueueFront(E element) {
        /*
          用以下代码也可以
          list.add(0, element)
        */
        list.addFirst(element);
    }

    /**
     * 队尾出队
     * @return E
     */
    public E deQueueRear() {
        /*
            使用以下代码同理
            list.remove(size())
         */
        return list.removeLast();
    }

    /**
     * 查看队头元素
     * @return E
     */
    public E front() {
        /*
            list.get(0)
         */
        return list.getFirst();
    }

    /**
     * 查看队尾元素
     * @return E
     */
    public E rear() {
        /*
            list.get(size())
         */
        return list.getLast();
    }

    /**
     * 清空元素
     */
    public void clear() {
        list.clear();
    }
}
